package com.merry.BeanDefinitionRegistry;

import org.springframework.beans.factory.BeanDefinitionStoreException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.*;
import org.springframework.core.AliasRegistry;

/**
 * 用于保存beanDefinition的注册表的接口，例如RootBeanDefinition和ChildBeanDefinition实例。
 * 通常由内部使用AbstractBeanDefinition层次结构的【BeanFactory】实现。
 * 这个接口通常是由 {BeanFactory} 接口的实现类实现，有两个核心的实现类 {@see DefaultListableBeanFactory}、 {@see GenericApplicationContext}
 *
 * @author Juergen Hoeller
 * @since 26.11.2003
 * @see org.springframework.beans.factory.config.BeanDefinition
 * @see AbstractBeanDefinition
 * @see RootBeanDefinition
 * @see ChildBeanDefinition
 * @see DefaultListableBeanFactory
 * @see org.springframework.context.support.GenericApplicationContext
 * @see org.springframework.beans.factory.xml.XmlBeanDefinitionReader
 * @see PropertiesBeanDefinitionReader
 */
public interface BeanDefinitionRegistry extends AliasRegistry {

    /**
     * 向容器中注册一个 {BeanDefinition} 对象，必须支持这两个实现类的注册。 {RootBeanDefinition} 、{ChildBeanDefinition}
     * Register a new bean definition with this registry.
     */
    void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
            throws BeanDefinitionStoreException;

    /**
     * 根据名字，删除一个 {BeanDefinition} 对象。
     */
    void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    /**
     * 根据名字，获取一个 {BeanDefinition} 对象。
     */
    BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

    /**
     * 根据名字，判断是否包含一个 {BeanDefinition} 对象。
     */
    boolean containsBeanDefinition(String beanName);

    /**
     * 返回容器中所有 {BeanDefinition} 对象的名字数组。
     */
    String[] getBeanDefinitionNames();

    /**
     * 获取容器中BeanDefinition对象的总数。
     */
    int getBeanDefinitionCount();

    /**
     * 判断这个名字的BeanDefinition对象是否被使用了。
     */
    boolean isBeanNameInUse(String beanName);

}
